package com.tengol.demo.design.pattern.structural.decorator.v1;

/**
 * 单元测试：假若没有使用装饰器模式
 * 业务场景：小明开了一个煎饼摊，每天来买煎饼的人络绎不绝，为了确保快速销售，小明制定了一些特定套餐：
 * 煎饼可以多加鸡蛋或香肠，鸡蛋1元一个，香肠2元一个
 * 1. 煎饼 8元一个，
 * 2. 煎饼多加一个鸡蛋 9元一个
 * 3. 煎饼多加一个鸡蛋多加一个香肠 11元一个
 * 4. 煎饼多加二个鸡蛋多加一个香肠 12元一个
 * 依次类推......
 *
 * 当前实现方式：
 * 1. 定义煎饼类：Battercake
 * 2. 定义煎饼加一个鸡蛋的套餐类：BattercakeWithEgg
 * 3. 定义煎饼加一个鸡蛋和香肠的套餐类：BattercakeWithEggSausage
 *
 * 可以看到没一个新品套餐都需要定义一个类，非常不方便扩展，而且套餐类多了以后容易造成混乱。
 *
 * @author dongrui
 * @date 2019/03/06
 */
public class Test {
    /**
     * 当前实现方式：需要为每一个煎饼套餐定义一个类，可以继承之前的煎饼类
     * 缺点很明显，当有新套餐时很难扩展，并且容易造成混乱
     * 这种情况下，可以考虑使用装饰器模式，提高套餐灵活性和复用性。
     */
    public static void main(String[] args) {
        //煎饼原套餐
        Battercake battercake = new Battercake();
        printInfo(battercake);
        //煎饼多加一个鸡蛋
        Battercake battercake1 = new BattercakeWithEgg();
        printInfo(battercake1);
        //煎饼多加一个鸡蛋和香肠
        Battercake battercake2 = new BattercakeWithEggSausage();
        printInfo(battercake2);
    }

    private static void printInfo(Battercake battercake){
        System.out.println(battercake.getDesc() + " 销售价格：" + battercake.cost());
    }
}
